import Food from './Food'
import ScorePanel from './ScorePanel'
import Snake from './Snake'

class GameControl{
    // 蛇
    snake:Snake;
    // 食物
    food:Food;
    // 积分
    scorePanel:ScorePanel;
    // 存储按键值
    direct:string='';
    // 判断游戏是否结束
    isLive:boolean=true

    constructor(){
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel();
        this.init()
    }

    init(){
        // 绑定键盘按键事件
        document.addEventListener('keydown',this.keydownHandler.bind(this)) //未bind之前，因为是document调用，this指向document，bind之后，this指向当前类
        this.run()
    }
    keydownHandler(event:KeyboardEvent){
        // 获取按键的键值  
        /**
         * ArrowUp
         * ArrowDown
         * ArrowRight
         * ArrowLeft
         */
        if(['ArrowUp','ArrowDown','ArrowRight','ArrowLeft'].includes(event.key)){
            this.direct=event.key;
        }
     }

    //  蛇移动
    run(){
        
        // 获取蛇头的坐标
        let x=this.snake.X
        let y=this.snake.Y

        // 判断蛇头移动的方向
        switch(this.direct){
            case 'ArrowUp':  // 上
                y-=10;
                break;
            case 'ArrowDown': // 下
                y+=10;
                break;
            case 'ArrowRight':  // 右
                x+=10;
                break;
            case 'ArrowLeft':   // 左
                x-=10;
                break;
        }
        // 判断蛇是否吃到食物
        this.checkEat(x,y)
          
        try {
            // 设置蛇头的坐标
        this.snake.X=x;
        this.snake.Y=y;
        } catch (e:any) {
            alert('游戏结束'+e.message)
            this.isLive=false
        }
        
       
        this.isLive && setTimeout(this.run.bind(this),300-(this.scorePanel.level-1)*50)
    }

    // 检查蛇是否吃到食物
    checkEat(x:number,y:number){
      if(this.food.X===x && this.food.Y===y){
            // 生成新的食物
            this.food.changFood()
            // 增加蛇身
            this.snake.addBody()
           // 增加积分
           this.scorePanel.addScore()
      }
    }

    

}
export default GameControl;